iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0

Java 的集合框架提供了一組可以存放、檢索和操作一組資料結構的工具。這些工具涵蓋了陣列(Array)、串列(List)、集合(Collection)、映射(Map)等。

Java 的集合框架位於 java.util 包中,主要分為三個核心介面:List、Set 和 Map。這些介面是集合框架的基礎。每個介面都有不同的實現類,例如 ArrayList、HashSet 和 HashMap。

核心介面關係圖

Collection 這個介面是 Set、List、Queue的父介面,定義了集合的基本操作(如 add、remove 等)。
Map 則是獨立於 Collection 之外的另一個介面。

              Collection
             /    |    \
         List   Queue   Set
          |              |
     ArrayList         HashSet
     LinkedList        TreeSet
     
        Map
         |
      HashMap

List 串列

List 是有序的集合,允許元素重複,List中的每個元素都有索引,從 0 開始。

常用的實作類別有:

ArrayList

特性:
1.基於陣列:ArrayList 是一個可變長度的陣列,當需要存儲的元素超過當前容量時,會動態擴展容量。
2.隨機存取快:ArrayList 因為底層是基於陣列結構,所以支援透過索引(get(index))進行快速的隨機存取,因為底層是陣列,透過索引存取元素的時間複雜度為 O(1)。
3.插入和刪除效率低(非尾部操作):在 ArrayList 中,若要在中間位置插入或刪除元素,必須移動後面的元素,這樣的操作時間複雜度為 O(n)。
4.儲存效率高:ArrayList 中的元素是緊密連續地存儲在內存中,因此儲存的空間利用率較高。

import java.util.ArrayList;

public class ListExample {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Orange");

        System.out.println("List Elements: " + list);
        // output: List Elements: [Apple, Banana, Orange]
        System.out.println("Element at index 1: " + list.get(1));
        // output: Element at index 1: Banana
    }
}

LinkedList

特性:
1.基於鏈表:LinkedList 的每個元素稱為「節點」,節點包含了元素值和指向前後節點的引用。元素不必連續存儲在內存中。
2.插入和刪除效率高:LinkedList 在首尾新增和刪除元素的時間複雜度為 O(1),因為只需要調整指標的引用。但在中間位置插入或刪除元素,需要先遍歷找到該位置,時間複雜度為 O(n)。
3.隨機存取效率低:由於是鏈表結構,訪問某個指定索引的元素需要從頭或尾開始遍歷,這樣的操作時間複雜度為 O(n)。
4.額外的內存開銷:每個節點都需要存儲兩個引用(指向前後節點的引用),因此相對於 ArrayList,LinkedList 需要更多的內存來維持結構。

import java.util.LinkedList;

public class LinkedListExample {
  public static void main(String[] args) {
    // 建立一個 LinkedList
    LinkedList<String> linkedList = new LinkedList<>();

    // 新增元素到 LinkedList
    linkedList.add("Apple");
    linkedList.add("Banana");
    linkedList.add("Orange");

    // 在開頭插入元素
    linkedList.addFirst("Mango");
    // 在結尾插入元素
    linkedList.addLast("Grapes");

    // 輸出整個 LinkedList
    System.out.println("LinkedList: " + linkedList);
    // output: LinkedList: [Mango, Apple, Banana, Orange, Grapes]

    // 取得第一個和最後一個元素
    String firstElement = linkedList.getFirst();
    String lastElement = linkedList.getLast();
    System.out.println("First Element: " + firstElement);
    //output: First Element: Mango
    System.out.println("Last Element: " + lastElement);
    //output: Last Element: Grapes

    // 刪除第一個和最後一個元素
    linkedList.removeFirst();
    linkedList.removeLast();

    // 刪除指定元素
    linkedList.remove("Banana");

    // 輸出刪除後的 LinkedList
    System.out.println("刪除後的 LinkedList: " + linkedList);
    //output: 刪除後的 LinkedList: [Apple, Orange]
  }
}

上一篇
【Day23】Java 中常用的內建註解(Annotations)
下一篇
【Day25】Java - Set (HashSet、TreeSet、LinkedHashSet)
系列文
從免費網路資源中入門java30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言